//路由器的配置文件

//1、安装

//2、 引入并声明使用
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '@/store'
Vue.use(VueRouter) //声明使用插件，所有的vue官方插件都要声明使用，第三方插件不需要
// 本质在调用插件内部的install方法，只有调用它，插件的功能才会添加到Vue身上和Vm身上
//3 、必须往外暴露一个路由器对象



const originPush = VueRouter.prototype.push  //把原本的push函数地址存起来，防止后面要用
const originReplace= VueRouter.prototype.replace  //把原本的push函数地址存起来，防止后面要用

//把今后使用的push改成我们自己定义的函数
VueRouter.prototype.push = function(location,resolved,rejected){
  if(resolved === undefined && rejected === undefined){
    return originPush.call(this,location).catch(() => {})
  }else{
    return originPush.call(this,location,resolved,rejected)
  }
}
VueRouter.prototype.replace = function(location,resolved,rejected){
  if(resolved === undefined && rejected === undefined){
    return originReplace.call(this,location).catch(() => {})
  }else{
    return originReplace.call(this,location,resolved,rejected)
  }
}

const router = new VueRouter({
  mode:'history',
  routes,
  scrollBehavior (to, from, savedPosition) {
    return { y: 0 }
  }
})

//配置全局前置路由导航守卫

// token校验（在校验的过程当中，就会通过token获取用户信息）
// 校验token是否过期 
// token使用 是需要添加到请求头里面的
router.beforeEach(async(to, from, next) => {
  // ...
  // to 目的地的路由对象
  // from  是发起的路由对象
  // next  是回调函数
  // 不带参数  代表无条件放行
  // 带了false 代表原地待着，啥也不干
  // 带了跳转的路径字符串或者对象，代表强制改变跳转的地方  next('/home') 
  

  //获取用户的token和用户的信息
  let token =  store.state.user.token
  let userInfo =  store.state.user.userInfo
  // 判断token在不在
  if(token){
    //如果token存在，代表用户登录过，但是用户信息在不在不知道
    if(to.path === '/login'){
      //登录过又去登录，不应该登录，强制跳转到首页
      next('/')
    }else{
      //登陆过，也不是重复去登录，而是去其它的页面
      //判断用户信息有没有
      if(userInfo.name){
        //代表用户登录了 也获取到用户信息了
        next()
      }else{
        //代表用户登录了，但是没获取用户信息，此时需要获取用户信息
        try {
          //获取用户信息成功
          await store.dispatch('getUserInfo')
          next()
        } catch (error) {
          //获取用户信息失败 一般都是token过期
          //清空原来的token，重新去登录
          store.dispatch('resetToken') //清空原来的token
          next('/login')
        }
      }
    }
  }else{
    //代表token不存在
    // next()
    let targetPath = to.path
    if(targetPath.indexOf('/trade')===0 || targetPath.startsWith('/pay') || targetPath.startsWith('/center')){
      next('/login?redirect='+targetPath)
    }else{
      next()
    }
  }
})


export default  router

// localStorage.setItem('xxxx',obj)
//4、 必须在Vue的配置对象当中注册路由器对象
